#ifndef _ZBJ_WORKFLOW_H_
#define _ZBJ_WORKFLOW_H_

#include "zbj_utils.h"
#include "gumbo.h"
#include "cJSON.h"

#ifdef __cplusplus
extern "C" {
#endif  // __cplusplus

typedef GumboNode* GumboNodePtr;
typedef const GumboNodePtr CGumboNodePtr;
typedef GumboElement* GumboElemPtr;
typedef const GumboElemPtr CGumboElemPtr;

typedef GumboAttribute* GumboAttribPtr;
typedef const GumboAttribPtr CGumboAttribPtr;

typedef cJSON* jsonPtr;

// true(1) or false(0)
int validate_args(int argc, char** argv);
int validate_file(FILE* file);

enum {
    eFacebookListPage, eFacebookCommentPage,
    eYoutubeListPage, eYoutubeCommentPage,
    eTwitterListPage, eTwitterCommentPage,
    eUnknownPage
};
typedef struct _PageTree {
    /* internal use */
    GumboOutput* page_entry;
    FileContents fileContent;

    /* useful information */
    int          page_type;
    char*        user_name;
} PageTree;

void init_pagetree(PageTree* page);
/* parse fileContent to page */
int parse_filecontent(FILE* file, PageTree* page);
void clean_pagetree(PageTree* page);

/* isXXXPage return true(1) or false(0).
   If return true, the page type is stored in argument (*page).
*/
int isFacebookPage(PageTree* page);
int isYoutubePage(PageTree* page);
int isTwitterPage(PageTree* page);
/* return true(1) or false(0) */
int check_page_type(PageTree* page);

/* output_xxx_json return true(1) or false(0).
   If return true, the json fragment is stored in argument (*json).
*/
int output_facebook_listpage_json(PageTree* page, jsonPtr* json);
int output_facebook_commentpage_json(PageTree* page, jsonPtr* json);
int output_youtube_listpage_json(PageTree* page, jsonPtr* json);
int output_youtube_commentpage_json(PageTree* page, jsonPtr* json);
int output_twitter_listpage_json(PageTree* page, jsonPtr* json);
int output_twitter_commentpage_json(PageTree* page, jsonPtr* json);
/* return true(1) or false(0).
   If return true, the json fragment is stored in argument (*json).
*/
int output_json(PageTree* page, jsonPtr* json);










/***************************************************************\
                          helper functions
\***************************************************************/

GumboElemPtr get_elem(GumboNodePtr node);
GumboNodePtr get_child_node(GumboNodePtr parent, GumboTag tag, const char* attr_name, const char* attr_value);
GumboNodePtr get_child_node_recursive(GumboNodePtr parent, GumboTag tag, const char* attr_name, const char* attr_value);
//GumboElemPtr get_child_tag(GumboElemPtr parent, GumboTag tag, const char** attr_name, const char** attr_value, int condition_count);

#ifdef __cplusplus
}
#endif // __cplusplus

#endif  // _ZBJ_WORKFLOW_H_
